﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>文件选择框 - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The 文件选择框 function displays a standard dialog that allows the user to open or save file(s)." />
<meta name="ahk:equiv-v1" content="commands/FileSelectFile.htm" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>文件选择框</h1>

<p>显示可以让用户打开或保存文件的标准对话框.</p>

<pre class="Syntax">SelectedFile := <span class="func">文件选择框</span>(<span class="optional">Options, RootDir\Filename, Title, Filter</span>)</pre>
<h2 id="Parameters">参数</h2>
<dl>

  <dt>Options</dt>
  <dd>
      <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
      <p>如果省略, 则它默认为 0, 这等同于下面的任意选项都没有指定.</p>
      <p><strong>M</strong>: 多选. 指定字母 M 让用户可以使用 Shift+点击, Control+点击或其他方法来选择多个文件. <strong>M</strong> 后面可以跟着下面描述的数字(例如, M 和 M1 都是有效的). 要逐个提取文件, 请参阅此页面底部的例子.</p>
      <p><strong>S</strong>: 保存按钮. 指定字母 S 让对话框显示保存按钮代替打开按钮. <strong>S</strong> 后面可以跟着下面描述的数字(或几个数的和)(例如, S 和 S24 都是有效的).</p>
      <p>尽管同时省略 <strong>M</strong> 和 <strong>S</strong>, 仍然可以使用下面的数字. 要让多个数字同时生效, 请把它们加在一起. 例如, 要使用 8 和 16, 请指定数字 24.</p>
      <p><strong>1</strong>: 文件必须存在<br>
        <strong>2</strong>: 路径必须存在<br>
        <strong>8</strong>: 提示创建新文件<br>
        <strong>16</strong>: 提示覆盖文件<br>
        <strong>32</strong>: 按原样选择快捷方式(.lnk 文件) 而不把它们解析为它们的目标. 此选项也避免了通过文件夹快捷方式跳转到那个文件夹的情况.</p>
      <p>如果使用 &quot;提示覆盖&quot; 选项而没有使用 &quot;提示创建&quot; 选项, 则对话框会包含保存按钮而不是打开按钮. 此行为是因为 Windows 的怪癖.</p>
  </dd>

  <dt>RootDir\Filename</dt>
  <dd>
      <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
      <p>如果存在, 则此参数包含下列的其中一个或两个:</p>
      <p><strong>RootDir</strong>: 根(起始) 目录, 如果未指定绝对路径, 则假定为 <a href="../Variables.htm#WorkingDir">内_工作目录</a> 中的子文件夹. 如果省略或为空, 则起始目录将为默认值, 这可能操作系统版本有关(它很可能是之前使用 文件选择框 时用户最近选择的目录).</p>
      <p><strong>Filename</strong>: 初始显示对话框时在编辑区域的默认文件名. 只显示单独的文件名(不带路径). 要让对话框正确显示, 请确保不包含非法字符(例如 /&lt;|:&quot;).</p>
      <p>示例:</p>
      <pre>"C:\My Pictures\Default Image Name.gif"  <em>; <i>RootDir</i> 和 <i>Filename</i> 都存在.</em>
"C:\My Pictures"  <em>; 仅 <i>RootDir</i> 存在.</em>
"My Pictures"  <em>; 仅 <i>RootDir</i> 存在, 且它相对于当前工作目录.</em>
"My File"  <em>; 仅 <i>Filename</i> 存在(但如果已存在 &quot;My File&quot; 的文件夹, 则它会被认为是 <i>RootDir</i>).</em></pre>
  </dd>

  <dt>Title</dt>
  <dd>
      <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
      <p>文件选择窗口的标题. 如果省略或为空, 则它默认为 <code>"Select File - " <a href="../Variables.htm#ScriptName">内_脚本名</a></code>(即当前脚本的名称).</p>
  </dd>

  <dt>Filter</dt>
  <dd>
      <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
      <p>指示对话框显示的文件类型.</p>
      <p>例如: 文本文档 (*.txt)<br>
        例如: 音频文件 (*.wav; *.mp2; *.mp3)</p>
      <p>如果省略, 则过滤器默认为 All Files (*.*). 在对话框 &quot;文件类型&quot; 菜单中, Text Documents (*.txt) 选项是可用的.</p>
    <p>否则, 过滤器使用指示的字符串, 不过在对话框的 &quot;文件类型&quot; 下拉列表中仍然提供了 All Files (*.*) 选项. 要在过滤器中包含多个文件扩展名, 请使用分号分隔它们, 如上所示.</p>
  </dd>

</dl>

<h2 id="Return_Value">返回值</h2>
<p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
<p>如果没有启用多选, 此函数将返回用户选择的单个文件的完整路径和名称.</p>
<p>如果使用了 M 选项(多选), 此函数将返回一个项目列表, 其中除最后一项外的每一项后面都有一个 换行符(`n). 列表中的首个项目是包含所有选择文件的路径(此路径仅在为根目录时才以反斜杠结尾, 例如 C:\). 其他项为选择的文件名(不带路径). 例如:</p>
<pre>C:\My Documents\New Folder [这是下面所有文件所在的路径]
test1.txt [这些是不含路径的文件名]
test2.txt
... 等等.</pre>
<p>(此页面底部的例子演示了如何逐个提取这些文件.)</p>
<p>如果启用了多选, 则所有选择文件名的总长度被限制为 64 KB. 虽然这通常足以容纳数千个文件, 但如果超过了限制, 则返回一个空字符串.</p>
<p>在这两种情况下, 如果用户取消对话框(即不希望选择文件), 则返回一个空字符串.</p>

<h2 id="Remarks">备注</h2>
<p>文件选择对话框通常看起来像这样:</p>
<img src="../static/dlg_file.png" alt="FileSelect" />
<p>界面 窗口可以使用 <a href="../objects/Gui.htm#OwnDialogs">+OwnDialogs</a> 选项的方法来显示模式文件夹选择对话框. 模式对话框在其消失之前会阻止用户与 界面 窗口进行交互.</p>
<p>已知限制: 在显示 目录选择框 对话框期间启动的<a href="SetTimer.htm">计时器</a>将推迟用户在对话框中单击的效果, 直到计时器结束为止. 要解决此问题, 请避免使用子程序需要很长时间来完成的计时器, 或在显示对话框期间禁用所有计时器:</p>
<pre><a href="Thread.htm">线程</a> "NoTimers"
SelectedFile := 文件选择框()
线程 "NoTimers", false</pre>

<h2 id="Related">相关</h2>
<p><a href="DirSelect.htm">目录选择框</a>, <a href="MsgBox.htm">信息框</a>, <a href="InputBox.htm">输入框</a>, <a href="ToolTip.htm">工具提示</a>, <a href="../objects/Gui.htm">GUI</a>, <a href="../misc/CLSID-List.htm">CLSID List</a>, <a href="LoopParse.htm">parsing 循环</a>, <a href="SplitPath.htm">分割路径</a></p>
<p>此外, 操作系统提供了标准的对话框让用户选取字体, 颜色或图标. 使用 <a href="DllCall.htm">动态库调用</a> 可以显示这些对话框, 如 <a href="https://github.com/majkinetor/mm-autohotkey/tree/master/Dlg">GitHub</a> 所示.</p>
<h2 id="Examples">示例</h2>
<div class="ex" id="ExBasic">
<p><a href="#ExBasic">#1</a></p>
<pre>SelectedFile := 文件选择框(3, , "Open a file", "Text Documents (*.txt; *.doc)")
如果 SelectedFile = ""
    信息框 "The user didn't select anything."
否则
    信息框 "The user selected the following:`n" SelectedFile</pre>
</div>

<div class="ex" id="ExMulti">
<p><a href="#ExMulti">#2</a>: 多选示例.</p>
<pre>files := 文件选择框("M3")  <em>; M3 = 选择多个现有文件.</em>
如果 files = ""
{
    信息框 "The user pressed cancel."
    返回
}
循环转换, files, "`n"
{
    如果 内_循环次数 = 1
        信息框 "The selected files are all contained in " 内_循环属性
    否则
    {
        Result := 信息框("The next file is " 内_循环属性 ". 跳过?",, 4)
        如果 Result = "No"
            跳出
    }
}
返回</pre>
</div>

</body>
</html>